package DAO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import Pojo.Turma;
import Pojo.Professor;
import Pojo.Disciplina;
import Pojo.Atividade;
import Pojo.HistoricoTurma;

/** Classe de implementação da TurmaDao.
*
* @author Maione José.
* 
* */
public class TurmaDaoImplArquivo implements TurmaDao{
	private List<Turma> listaTurmas;
	private static final String nomeArquivo = "Arquivos/Turmas.txt";
	private int proximoId;
	
	/**Método construtor com identificador
	 * 
	 * @param identificador
	 */
	public TurmaDaoImplArquivo(int identificador){
		this.listaTurmas = new ArrayList<Turma>();
		this.proximoId=0;
	}
	
	/**Método construtor sem identificador.
	 * 
	 */
	public TurmaDaoImplArquivo(){
		this.listaTurmas = new ArrayList<Turma>();
		this.proximoId=0;
		this.buscarArmazenamento();
	}
	
	/**Getter de Próximo Id
	 * 
	 * @return int com o Próximo Id
	 */
	public int getProximoId(){
		return(this.proximoId);
	}
	
	/**Getter de Lista de Turmas
	 * 
	 * @return List<Turma> com a lista de turmas.
	 */
	public List<Turma> getListaTurma(){
		return(this.listaTurmas);
	}
	
	/**Busca de dados do arquivo.
	 * 
	 */
	private void buscarArmazenamento(){
		try{
			this.listaTurmas = new ArrayList<Turma>();
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    Turma turma;
		    String dados[];
		    Disciplina disciplinaAux;
		    Professor professorAux; 
		    List<Atividade> listaAtividades;
		    List<HistoricoTurma> listaHistoricoTurmas; 
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	professorAux = this.buscarProfessor(Integer.parseInt(dados[7]));
		        disciplinaAux = this.buscarDisciplina(Integer.parseInt(dados[8]));
		        listaAtividades = this.buscarAtividades(Integer.parseInt(dados[0]));
		        listaHistoricoTurmas = this.buscarHistoricoTurmas(Integer.parseInt(dados[0]));
		    	turma = new Turma(Integer.parseInt(dados[0]),Integer.parseInt(dados[1]),Integer.parseInt(dados[2]),dados[3],dados[4],Integer.parseInt(dados[5]),Boolean.parseBoolean(dados[6]),professorAux,disciplinaAux,listaAtividades,listaHistoricoTurmas);
		    	this.listaTurmas.add(turma);
		    	linha = lerArq.readLine();						//Lê as linhas.
		    	this.proximoId=Integer.parseInt(dados[0]);
		    
		    }
		    this.proximoId++;
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
	}
	
	/**Busca de dados de turmas para determinado professor
	 * 
	 * @param idProfessor
	 * @return List<Turma> com as turmas encontradas.
	 */
	public List<Turma> buscarArmazenamentoProcurarPorProfessor(int idProfessor){
		List<Turma> listaTurmas = new ArrayList<Turma>();
		try{
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    String dados[];
		    Turma turma;
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	if (Integer.parseInt(dados[7])==idProfessor){
		    		turma = new Turma(Integer.parseInt(dados[0]),Integer.parseInt(dados[1]),Integer.parseInt(dados[2]),dados[3],dados[4],Integer.parseInt(dados[5]),Boolean.parseBoolean(dados[6]));
		    		listaTurmas.add(turma);
		    	}
		    	linha = lerArq.readLine();						//Lê as linhas.
		    }
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
		return(listaTurmas);
	}
	
	/**Busca de dados de turmas referentes a uma disciplina.
	 * 
	 * @param idDisciplina
	 * @return List<Turma> com as turmas encontradas.
	 */
	public List<Turma> buscarArmazenamentoProcurarPorDisciplina(int idDisciplina){
		List<Turma> listaTurmas = new ArrayList<Turma>();
		try{
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    String dados[];
		    Turma turma;
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	if (Integer.parseInt(dados[8])==idDisciplina){
		    		turma = new Turma(Integer.parseInt(dados[0]),Integer.parseInt(dados[1]),Integer.parseInt(dados[2]),dados[3],dados[4],Integer.parseInt(dados[5]),Boolean.parseBoolean(dados[6]));
		    		listaTurmas.add(turma);
		    	}
		    	linha = lerArq.readLine();						//Lê as linhas.
		    }
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
		return(listaTurmas);
	}
	
	/**Busca de dados de uma turma referente ao um Id
	 * 
	 * @param idTurma
	 * @return Turma com a turma procurada.
	 */
	public Turma buscarArmazenamentoProcurarPorId(int idTurma){
		Turma turma=null;
		
		try{
			FileReader arq = new FileReader(nomeArquivo);		//Cria objeto arquivo
		    BufferedReader lerArq = new BufferedReader(arq);	//Cria objeto de leitura
		    String linha=lerArq.readLine();
		    String dados[];
		    
		    while (linha != null) {
		    	dados = linha.split("\t");
		    	if (Integer.parseInt(dados[0])==idTurma){
		    		turma = new Turma(Integer.parseInt(dados[0]),Integer.parseInt(dados[1]),Integer.parseInt(dados[2]),dados[3],dados[4],Integer.parseInt(dados[5]),Boolean.parseBoolean(dados[6]));
		    		return(turma);
		    	} 	    	
		    	linha = lerArq.readLine();//Lê as linhas.
		    }
		    
		    arq.close();										//Fechando o arquivo
		}catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
		return(turma);
	}
	
	/**Armazenamento de dados da turma no arquivo.
	 * 
	 */
	private void salvarArmazenamento(){
		try {
			BufferedWriter out = new BufferedWriter(new FileWriter(nomeArquivo));
			Iterator<Turma> i = this.listaTurmas.iterator();
			
			Turma turma;
			while(i.hasNext()){
				turma = (Turma) i.next();
				out.write(turma.toString());
			}
			
			out.close();
		} catch (IOException e) {
			System.err.printf("Erro ao manipular o arquivo: %s.\n",e.getMessage());
		}
	}
	
	/**Método para inserção de turma na lista de turmas.
	 * 
	 */
	public boolean adicionarTurma(Turma turma){
		if (turma.getDisciplina() == null || turma.getProfessor() == null){
			return (false);
		}else{
			Iterator<Turma> i = listaTurmas.iterator();
			Turma turmaComparacao;
			while(i.hasNext()){
				turmaComparacao = (Turma) i.next();
				if (turmaComparacao.getIdTurma() == turma.getIdTurma()){
					return(false);
				}
			}
			this.listaTurmas.add(turma);
			this.proximoId++;
			this.salvarArmazenamento();
			return(true);
		}
	}
	
	/**Método para remoção de turma da lista.
	 * 
	 */
	public boolean removerTurma(Turma turma){
		Iterator<Turma> i = listaTurmas.iterator();
		Turma turmaComparacao;
		boolean resultado;
		while(i.hasNext()){
			turmaComparacao = (Turma) i.next();
			if (turmaComparacao.getIdTurma() == turma.getIdTurma()){
				resultado = this.listaTurmas.remove(turmaComparacao);
				this.salvarArmazenamento();
				return(resultado);
			}
		}
		return(false);
	}
	
	/** Método para pesquisa de turma referente a um Id.
	 * 
	 * @param idTurma
	 * @return
	 */
	public Turma pesquisarPorId(int idTurma){
		Iterator<Turma> i = listaTurmas.iterator();
		Turma turma;
		while(i.hasNext()){
			turma = (Turma) i.next();
			if (turma.getIdTurma() == idTurma){
				return(turma);
			}
		}
		return(null);
	}
	
	/**Pesquisa de turmas lecionadas por um determinado professor.
	 * 
	 * @param idProfessor
	 * @return List<Turma> com as turmas encontradas.
	 */
	public List<Turma> procurarPorProfessor(int idProfessor){
		List<Turma> listaTurmas = new ArrayList<Turma>();
		
		Iterator<Turma> i = listaTurmas.iterator();
		Turma turma;
		while(i.hasNext()){
			turma = (Turma) i.next();
			if ((turma.getProfessor().getIdProfessor() == idProfessor)&&(turma.getFinalizada()==false)){
				listaTurmas.add(turma);
			}
		}
		return(listaTurmas);
	}
	
	/**Pesquisa de Turma com os parâmetros disciplina, ano e período.
	 * 
	 * @param idDisciplina
	 * @param ano
	 * @param periodo
	 * @return List<Turma> com as turmas encontradas.
	 */
	public List<Turma> pesquisarPorDisciplinaAnoPeriodo(int idDisciplina, int ano, int periodo){
		List<Turma> lista = new ArrayList<Turma>();
		Iterator<Turma> i = listaTurmas.iterator();
		Turma turma;
		while(i.hasNext()){
			turma = (Turma) i.next();
			if ((turma.getDisciplina().getIdDisciplina()==idDisciplina)&&(turma.getAno()==ano)&&(turma.getPeriodo()==periodo)){
				lista.add(turma);
			}
		}
		return(lista);
	}
	
	/**Busca de professor pelo id
	 * 
	 * @param idProfessor
	 * @return Professor referente ao id.
	 */
	private Professor buscarProfessor(int idProfessor){
		ProfessorDaoImplArquivo professorDao = new ProfessorDaoImplArquivo(idProfessor);
		return(professorDao.buscarArmazenamentoProcurarPorId(idProfessor));
	}
	
	/**Busca de disciplina pelo id.
	 * 
	 * @param idDisciplina
	 * @return Disciplina referente ao id.
	 */
	private Disciplina buscarDisciplina(int idDisciplina){
		DisciplinaDaoImplArquivo disciplinaDao = new DisciplinaDaoImplArquivo(idDisciplina);
		return(disciplinaDao.buscarArmazenamentoProcurarPorId(idDisciplina));
	}
	
	/**Busca de atividades pelo id da turma
	 * 
	 * @param idTurma
	 * @return List<Atividade> com as atividades encontradas.
	 */
	private List<Atividade> buscarAtividades(int idTurma){
		AtividadeDaoImplArquivo atividadeDao = new AtividadeDaoImplArquivo();
		return(atividadeDao.buscarArmazenamentoPorTurma(idTurma));
	}
	
	/**Busca de Histórico da turma pelo id da mesma.
	 * 
	 * @param idTurma
	 * @return List<HistoricoTurma> com os históricos encontrados.
	 */
	private List<HistoricoTurma> buscarHistoricoTurmas(int idTurma){
		HistoricoTurmaDaoImplArquivo historicoTurmaDao = new HistoricoTurmaDaoImplArquivo();
		return(historicoTurmaDao.buscarArmazenamentoPorTurma(idTurma));
	}
	
}
